package br.com.duosoftware.orcamento.managedbeans;

import br.com.duosoftware.orcamento.daos.ConfirmacaoDAO;
import br.com.duosoftware.orcamento.daos.FichaExtraOrcamentariaDAO;
import br.com.duosoftware.orcamento.daos.PlanoDeContaExtraDAO;
import br.com.duosoftware.orcamento.daos.TipoExtraDAO;
import br.com.duosoftware.orcamento.daos.UnidadeGestoraDAO;
import br.com.duosoftware.orcamento.daos.UnidadeOrcamentariaDAO;
import br.com.duosoftware.orcamento.entidades.Confirmacao;
import br.com.duosoftware.orcamento.entidades.FichaExtraOrcamentaria;
import br.com.duosoftware.orcamento.entidades.PlanoDeContaExtra;
import br.com.duosoftware.orcamento.entidades.TipoExtra;
import br.com.duosoftware.orcamento.entidades.UnidadeGestora;
import br.com.duosoftware.orcamento.entidades.UnidadeOrcamentaria;
import br.com.duosoftware.orcamento.services.FichaExtraOrcamentariaService;
import br.com.duosoftware.orcamento.utils.Mensagens;
import java.io.Serializable;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Renato
 *
 */
@ManagedBean
@ViewScoped
public class FichaExtraOrcamentariaBean implements Serializable {

    private FichaExtraOrcamentaria fichaExtraOrcamentaria;
    private List<FichaExtraOrcamentaria> fichasExtraOrcamentaria;
    private FichaExtraOrcamentariaDAO fichaExtraOrcamentariaDAO;
    private FichaExtraOrcamentariaService fichaExtraOrcamentariaService;
    //
    ///****Select Itens****
    //
    private List<SelectItem> unidadesGestoras;
    private List<SelectItem> unidadesOrcamentarias;
    private List<SelectItem> contasExtra;
    private List<SelectItem> tiposExtra;
    private List<SelectItem> confirmacoes;

    public FichaExtraOrcamentariaBean() {
        fichaExtraOrcamentariaDAO = new FichaExtraOrcamentariaDAO();
        fichaExtraOrcamentariaService = new FichaExtraOrcamentariaService();
    }

    public FichaExtraOrcamentaria getFichaExtraOrcamentaria() {
        return fichaExtraOrcamentaria;
    }

    public void setFichaExtraOrcamentaria(FichaExtraOrcamentaria fichaExtraOrcamentaria) {
        this.fichaExtraOrcamentaria = fichaExtraOrcamentaria;
    }

    public List<FichaExtraOrcamentaria> getFichasExtraOrcamentaria() {
        if (fichasExtraOrcamentaria == null) {
            fichasExtraOrcamentaria = fichaExtraOrcamentariaDAO.listarFichasExtraOrcamentaria();
        }
        return fichasExtraOrcamentaria;
    }

    public void setFichasExtraOrcamentaria(List<FichaExtraOrcamentaria> fichasExtraOrcamentaria) {
        this.fichasExtraOrcamentaria = fichasExtraOrcamentaria;
    }

    public FichaExtraOrcamentariaService getFichaExtraOrcamentariaService() {
        return fichaExtraOrcamentariaService;
    }

    /**
     * <b>Método que inicializa a fichaExtraOrcamentaria a ser
     * cadastrado.</b><p>
     *
     * @return void
     *
     */
    public void adicionarInicio() {

        fichaExtraOrcamentaria = new FichaExtraOrcamentaria();
        fichaExtraOrcamentaria.setDataInclusao(new Date());
        fichaExtraOrcamentaria.setFichaExtra(fichaExtraOrcamentariaDAO.obterSequenciaFichaExtra());

    }

    /**
     * <b>Método que adiciona ou edita uma FichaExtraOrcamentaria</b><p>
     *
     * Após o término o método fecha o dialog de cadastro.
     * <p>
     *
     * @return void
     *
     */
    public void adicionarEditarFim() {

        fichaExtraOrcamentariaDAO.salvarOuAtualizar(fichaExtraOrcamentaria);
        fichaExtraOrcamentaria = new FichaExtraOrcamentaria();
        fichasExtraOrcamentaria = null;

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgFichaExtraOrcamentaria.hide()");
        requestContext.update("formFichasExtraOrcamentaria:dtFichasExtraOrcamentaria");

    }

    /**
     * <b>Método para iniciar o processo de edição de um
     * FichaExtraOrcamentaria.</b>
     * <p>
     *
     * Ele verifica se há um FichaExtraOrcamentaria selecionada para edição, se
     * não houver é emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um FichaExtraOrcamentaria selecionado o médoto abre o dialog
     * para edição<p>
     *
     * @return void
     *
     */
    public void editarInicio() {

        if (fichaExtraOrcamentaria == null) {

            Mensagens.mensagemDeAlerta("Selecione um registro", "Selecione um re"
                    + "gistro para Editar");

        } else {

            RequestContext.getCurrentInstance().execute("dlgFichaExtraOrcamentaria.show()");

        }

    }

    /**
     * <b>Método para iniciar o processo de exclusão de um
     * FichaExtraOrcamentaria.</b>
     * <p>
     *
     * Ele verifica se há uma FichaExtraOrcamentaria selecionado para exclusão,
     * se não houver é emitida uma mensagem pedindo que o usuário selecione
     * uma.<p>
     *
     * Caso haja um FichaExtraOrcamentaria selecionado o médoto abre um p:dialog
     * para confirma ção da exclusão.<p>
     *
     * @return void
     *
     */
    public void excluirInicio() {

        if (fichaExtraOrcamentaria == null) {
            Mensagens.mensagemDeAlerta("Selecione um registro",
                    "Selecione um registro para excluir");
        } else {
            RequestContext.getCurrentInstance()
                    .execute("dlgExcluirFichaExtraOrcamentaria.show()");
        }

    }

    /**
     * <b>Método para excluir um FichaExtraOrcamentaria.</b>
     * <p>
     *
     * Ele verifica se a FichaExtraOrcamentaria selecionado para exclusão está
     * sendo utilizado por alguma outra tabela do banco. Se estiver uma mensagem
     * de aviso é dada ao usuário<p>
     *
     * @return void
     *
     */
    public void excluirFim() {

        try {

            fichaExtraOrcamentariaDAO.excluir(fichaExtraOrcamentaria);
            fichaExtraOrcamentaria = new FichaExtraOrcamentaria();
            fichasExtraOrcamentaria = null;

        } catch (ConstraintViolationException e) {
            Mensagens.mensagemDeAlerta("Registro Utilizado",
                    "Esse registro está sendo utilizado");
        }

        RequestContext.getCurrentInstance()
                .execute("dlgExcluirFichaExtraOrcamentaria.hide()");

    }

    /**
     * <b> Método para cancelar uma operação de cadastro ou edição.</b>
     * <p>
     *
     * O método instancia um novo objeto na variável FichaExtraOrcamentaria para
     * limpar as infomações.<p>
     *
     * @return void
     */
    public void cancelar() {

        fichaExtraOrcamentaria = new FichaExtraOrcamentaria();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgFichaExtraOrcamentaria.hide()");
        requestContext.update("formFichaExtraOrcamentaria:dtFichasExtraOrcamentaria");

    }

    //
    //get SelectItens
    //
    public List<SelectItem> getUnidadesGestoras() {

        unidadesGestoras = new LinkedList<SelectItem>();

        for (UnidadeGestora unidadeGestora : new UnidadeGestoraDAO()
                .listarUnidadesGestoras()) {

            unidadesGestoras.add(new SelectItem(unidadeGestora, unidadeGestora.toString()));

        }

        return unidadesGestoras;

    }

    public List<SelectItem> getUnidadesOrcamentarias() {

        if (fichaExtraOrcamentaria.getUnidadeGestora() != null) {

            unidadesOrcamentarias = new LinkedList<SelectItem>();

            for (UnidadeOrcamentaria unidadeOrcamentaria : new UnidadeOrcamentariaDAO()
                    .listarUnidadeOrcamentaria(fichaExtraOrcamentaria.getUnidadeGestora())) {

                unidadesOrcamentarias.add(new SelectItem(unidadeOrcamentaria, unidadeOrcamentaria.toString()));

            }

        }

        return unidadesOrcamentarias;

    }

    public List<SelectItem> getContasExtra() {

        contasExtra = new LinkedList<SelectItem>();

        if (fichaExtraOrcamentaria.getUnidadeGestora() != null) {
            if (fichaExtraOrcamentaria.getUnidadeGestora().getTipoOrgao().getCodigo()
                    .equalsIgnoreCase("02")) {
                for (PlanoDeContaExtra planoDeContaExtra : new PlanoDeContaExtraDAO()
                        .listarPlanosDeContaCamara()) {

                    contasExtra.add(new SelectItem(planoDeContaExtra, planoDeContaExtra
                            .toString()));

                }
                
            } else {
                for (PlanoDeContaExtra planoDeContaExtra : new PlanoDeContaExtraDAO()
                        .listarPlanosDeContaExtra()) {

                    contasExtra.add(new SelectItem(planoDeContaExtra, planoDeContaExtra
                            .toString()));

                }
                
            }
            
        }

        return contasExtra;

    }

    public List<SelectItem> getTiposExtra() {

        if (tiposExtra == null) {

            tiposExtra = new LinkedList<SelectItem>();

            for (TipoExtra tipoExtra : new TipoExtraDAO().listarTiposExtra()) {

                tiposExtra.add(new SelectItem(tipoExtra, tipoExtra.toString()));

            }

        }

        return tiposExtra;

    }

    public List<SelectItem> getConfirmacoes() {

        if (confirmacoes == null) {

            confirmacoes = new LinkedList<SelectItem>();

            for (Confirmacao confirmacao : new ConfirmacaoDAO()
                    .listarConfirmacoes()) {

                confirmacoes.add(new SelectItem(confirmacao, confirmacao.toString()));

            }

        }

        return confirmacoes;

    }

}
